/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;


import interfaces.Interfaz1.VentanaGanaste;
import java.util.ArrayList;
import javax.swing.JLabel;
import models.Archivo;
import models.Conversor;
import models.Tiempo;

/**
 *
 * @author Administrador
 */
public class Game {
    Tiempo time;
    private int[][] juego;
    private int[][] solucion;
    private int[][] matrizInicial;
    public boolean juegoGanado;
    
    
    
    public Game(){
 
    }
    
    public void asignarJLabelTiempo(JLabel tiemp, boolean comenzar){
        if(comenzar){
            time = new Tiempo(tiemp);
            time.iniciarCronometro();
        }else{
            time = new Tiempo(tiemp,time.minutos,time.segundos-1,time.milesimas);
            time.iniciarCronometro();
        }    
    }
    
    public int[][] obtenerMatrizJuego(){
        return juego;
    }
    
    private int[][] copiarMatriz(int[][] matriz){
        int[][] matrizCopy = new int[9][9];
        for(int i=0; i<9 ; i++){
           for(int j=0; j<9 ;j++){
               matrizCopy[i][j]=matriz[i][j];
           }
        }
        return matrizCopy;
    }
    
    public void newGame(int dificultad){
        juegoGanado=false;
        juego = new int[9][9];  // matriz juego corriente
        solucion = new int[9][9]; //matriz solucion.
        matrizInicial = new int[9][9]; //matriz inicial
        
        switch(dificultad){
            case 1 : juego=Conversor.matrCharToMatrInt(Network.obtenerMatrizF());
            case 2 : juego=Conversor.matrCharToMatrInt(Network.obtenerMatrizM());
            case 3 : juego=Conversor.matrCharToMatrInt(Network.obtenerMatrizD());
        }
        
        matrizInicial=copiarMatriz(juego);
        int[][] aux = copiarMatriz(juego);
        solucion=LogicaGame.solucionarMatriz(aux);    
    }
    
    public void cargarPartidaGuardada(JLabel tiemp){
        juegoGanado=false;
        ArrayList<String> partida = Archivo.obtenerPartida();
       
        matrizInicial = Conversor.stringToMatrizInt(partida.get(0));
        juego = Conversor.stringToMatrizInt(partida.get(0));
        int[][] flag = Conversor.stringToMatrizInt(partida.get(1));
        int min = Integer.parseInt(partida.get(2));
        int seg = Integer.parseInt(partida.get(3));
        int mil = Integer.parseInt(partida.get(4));
        time = new Tiempo(tiemp,min,seg,mil);
        
        for(int x=0; x<9;x++){
            for(int y=0; y<9; y++){
                if(matrizInicial[x][y]==0){
                    juego[x][y]=flag[x][y];
                }
            }
        }
        solucion=LogicaGame.solucionarMatriz(copiarMatriz(matrizInicial));   
        time.iniciarCronometro();
    }
    
    public boolean guardarPartida(){
        ArrayList<String> partida = new ArrayList();
        int[][] flag = new int[9][9];
        int min = time.minutos;
        int seg = time.segundos;
        int mil = time.milesimas;
        for(int x=0; x<9;x++){
            for(int y=0; y<9; y++){
                if(matrizInicial[x][y]!=juego[x][y]){
                    flag[x][y]=juego[x][y];
                }
            }
        }
        
        return Archivo.agregarPartida(matrizInicial, flag, min, seg, mil);
        
        
    }
    
    public boolean insertValor(int fila, int columna, char valor){
        int numero;
        try{
           numero= Integer.parseInt(valor+"");
        }catch(Exception e){
           numero=0;
        }
        if ((numero<10) && (numero>0)){
            juego[fila][columna]=numero;
            if (solucionCorrecta()){
                juegoGanado=true;
                time.pararCronometro();
            }
            return true;
        }else{
            return false;
        }
    }
    
   private boolean solucionCorrecta(){
       for(int i=0; i<9 ; i++){
           for(int j=0; j<9 ;j++){
               if (juego[i][j]!=solucion[i][j]){
                   return false;
               }
           }
       }
       return true;
   } 
   
   
   private void penalizarTiempoPorAyuda(){
       time.minutos=time.minutos+2;
   }
   
   public int[][] obtenerSolucion(){
       return solucion;
   }
    

   public int[][] obtenerMatrizInicial(){
       return matrizInicial;
   }
   
   public int obtenerAyuda(int x , int y){
       if(x<9 && y<9){
           penalizarTiempoPorAyuda();
           return solucion[x][y];
       }else{
           return -1;
       }
       
   }
   
   public boolean ganoJuego(){
       for(int i=0; i<9; i++){
           for(int j=0; j<9; j++){
               if(juego[i][j]!=solucion[i][j]){
                   return false;
               }
           }
       }
       return true;
   }
   
   public int[] obtenerTiempo(){
       int[] t = new int[3];
       t[0]=time.minutos;
       t[1]=time.segundos;
       t[2]=time.milesimas;
       return t;
       
   }


}
